package br.com.sgbl.dao;

import br.com.sgbl.bean.Fornecedor;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author heidi
 */
public class FornecedorDao {

    private static final String SQL_LISTAR =
            "SELECT * FROM fornecedor";
    private static final String SQL_INSERIR =
            "INSERT INTO fornecedor (id, razao, vendedor , cpfcnpj, telefone) VALUES (?,?,?,?,?)";
    private static final String SQL_ALTERAR =
            "UPDATE fornecedor SET razao = ?, vendedor = ?, cpfcnpj = ?, telefone = ? WHERE id = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM fornecedor WHERE id = ?";

    public Fornecedor localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_LISTAR + " where id=?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Fornecedor fornecedor = new Fornecedor();
            fornecedor.setId(rs.getLong("id"));
            fornecedor.setRazao(rs.getString("razao"));
            fornecedor.setVendedor(rs.getString("vendedor"));
            fornecedor.setCpfCnpj(rs.getLong("cpfcnpj"));
            fornecedor.setTelefone(rs.getString("telefone"));

            return fornecedor;
        } else {
            return null;
        }
    }

    public Fornecedor salvar(Fornecedor fornecedor) throws SQLException {
        if (fornecedor.getId() == 0) {
            return inserir(fornecedor);
        } else {
            return alterar(fornecedor);
        }
    }

    private Fornecedor inserir(Fornecedor fornecedor) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            ps.setNull(1, Types.NULL);
            ps.setString(2, fornecedor.getRazao());
            ps.setString(3,fornecedor.getVendedor());
            ps.setLong(4, fornecedor.getCpfCnpj());
            ps.setString(5, fornecedor.getTelefone());


            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            fornecedor.setId(rs.getLong("GENERATED_KEY"));

            conn.commit();
        } finally {
            conn.close();
        }

        return fornecedor;
    }

    private Fornecedor alterar(Fornecedor fornecedor) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);

            ps.setString(1, fornecedor.getRazao());
            ps.setString(2, fornecedor.getVendedor());
            ps.setLong(3, fornecedor.getCpfCnpj());
            ps.setString(4, fornecedor.getTelefone());
            ps.setLong(5, fornecedor.getId());


            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }

        return fornecedor;
    }

    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Fornecedor fornecedor = new Fornecedor();

                fornecedor.setId(rs.getLong("id"));
                fornecedor.setRazao(rs.getString("razao"));
                fornecedor.setVendedor(rs.getString("vendedor"));
                fornecedor.setCpfCnpj(rs.getLong("cpfcnpj"));
                fornecedor.setTelefone(rs.getString("telefone"));

                lista.add(fornecedor);
            }
        } finally {
            conn.close();
        }

        return lista;
    }

    public void excluir(Fornecedor fornecedor) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);

            ps.setLong(1, fornecedor.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
    }
}
